package top.heue.utils.base.helper

import android.view.LayoutInflater
import android.view.Menu
import androidx.activity.ComponentActivity
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import top.heue.utils.base.base.BaseActivity
import java.lang.reflect.Method

/** 传入对应界面的ViewDatabind，在需要的时候执行给定的lambda，为了少传参数也是拼了*/
inline fun <reified T : ViewDataBinding> ComponentActivity.inflate(crossinline initializer: T.() -> Unit) =
    lazy { inflate(this.layoutInflater, initializer) }

/** 传入对应界面的ViewDatabind，在需要的时候执行给定的lambda，为了少传参数也是拼了*/
inline fun <reified T : ViewDataBinding> Fragment.inflate(crossinline initializer: T.() -> Unit) =
    lazy { inflate(this.layoutInflater, initializer).apply { lifecycleOwner = viewLifecycleOwner } }

/** 注意此方法inflater不是一实例化就有的，所以要合理lazy*/
inline fun <reified T : ViewDataBinding> inflate(
    inflater: LayoutInflater,
    crossinline initializer: T.() -> Unit
) =
    run {
        val c = T::class.java.getMethod("inflate", LayoutInflater::class.java)
            .invoke(null, inflater) as T
        initializer(c)
        c
    }

fun Fragment.activity() = lazy { this.requireActivity() as BaseActivity }

/**
 * 解决不显示menu icon的问题
 * @param menu
 * @param flag
 */
fun setIconsVisible(menu: Menu?, flag: Boolean) {
    //判断menu是否为空
    if (menu != null) {
        try {
            //如果不为空,就反射拿到menu的setOptionalIconsVisible方法
            val method: Method = menu.javaClass
                .getDeclaredMethod("setOptionalIconsVisible", java.lang.Boolean.TYPE)
            //暴力访问该方法
            method.isAccessible = true
            //调用该方法显示icon
            method.invoke(menu, flag)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}